home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / GCC257RM.ZIP / utils / gcc-rm / msdos.c < prev    next >
C/C++ Source or Header  |  1993-07-03  |  2KB  |  101 lines

  1. #include <sys/stat.h>
  2. #include <errno.h>
  3. #include <process.h>
  4. #include <ctype.h>
  5.  
  6. bcopy(a,b,c)
  7. {
  8.   return memcpy(b,a,c);
  9. }
  10.  
  11. bzero(a,b)
  12. {
  13.   return memset(a,0,b);
  14. }
  15.  
  16. index(a,b)
  17. {
  18.   return strchr(a,b);
  19. }
  20.  
  21. kill()
  22. {
  23. }
  24.  
  25. #undef getpid
  26. getpid()
  27. {
  28.   return 42;
  29. }
  30.  
  31. int system(const char *p)
  32. {
  33.   char fn[128];
  34.   char line[128];
  35.   sscanf(p, " %s %s", fn, line);
  36.   return spawnlp(P_WAIT, fn, fn, line, 0);
  37. }
  38.  
  39. char *
  40. mktemp(path)
  41.     char *path;
  42. {
  43.     extern int errno;
  44.     register char *start, *trv;
  45.     struct stat sbuf;
  46.     unsigned int pid;
  47.  
  48.     pid = getpid();
  49.     for (trv = path; *trv; ++trv);        /* extra X's get set to 0's */
  50.     while (*--trv == 'X') {
  51.         *trv = (pid % 10) + '0';
  52.         pid /= 10;
  53.     }
  54.  
  55.     /*
  56.      * check the target directory; if you have six X's and it
  57.      * doesn't exist this runs for a *very* long time.
  58.      */
  59.     for (start = trv + 1;; --trv) {
  60.         if (trv <= path)
  61.             break;
  62.         if (*trv == '/') {
  63.             *trv = '\0';
  64.             if (trv[-1] == ':') {
  65.                 *trv = '/';
  66.                 break;
  67.             }
  68.             if (stat(path, &sbuf))
  69.                 return(0);
  70.             if (!(sbuf.st_mode & S_IFDIR)) {
  71.                 errno = ENOTDIR;
  72.                 return(0);
  73.             }
  74.             *trv = '/';
  75.             break;
  76.         }
  77.     }
  78.  
  79.     for (;;) {
  80.         if (stat(path, &sbuf))
  81.             return(errno == ENOENT ? path : 0);
  82.  
  83.         /* tricky little algorithm for backward compatibility */
  84.         for (trv = start;;) {
  85.             if (!*trv)
  86.                 return(0);
  87.             if (*trv == 'z')
  88.                 *trv++ = 'a';
  89.             else {
  90.                 if (isdigit(*trv))
  91.                     *trv = 'a';
  92.                 else
  93.                     ++*trv;
  94.                 break;
  95.             }
  96.         }
  97.     }
  98.     /*NOTREACHED*/
  99. }
  100.  
  101.